import crypto from "node:crypto";

class Encipher {
  // 对称加密算法的实现
  static symmetry(password) {
    const algorithm = "aes-256-cbc"; // 算法名称
    const key = crypto.randomBytes(32); // 生成随机密钥，长度为32字节（256位）
    const iv = Buffer.from(crypto.randomBytes(16)); // 生成随机初始化向量（IV），长度为16字节

    const cipher = crypto.createCipheriv(algorithm, key, iv); // 创建加密器
    cipher.update(password, "utf8", "hex"); // 对信息进行加密并转换为十六进制字符串
    const encrypted = cipher.final("hex"); // 输出最终的加密结果（十六进制字符串）

    return { key, iv, encrypted }; // 返回密钥、初始化向量和加密后的信息
  }

  // 非对称加密算法的实现
  static dissymmetry(password) {
    // 生成RSA密钥对（公钥和私钥）
    const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
      modulusLength: 2048, // 密钥长度，越长越安全，但计算量越大
      publicKeyEncoding: { type: "spki", format: "pem" },
      privateKeyEncoding: { type: "pkcs8", format: "pem" },
    });

    const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(password)); // 使用公钥加密信息
    return { publicKey, privateKey, encrypted }; // 返回公钥、私钥和加密后的信息
  }

  // 哈希算法加密的实现
  static hash(password) {
    const hash = crypto.createHash("sha256"); // 创建哈希对象，使用SHA-256算法
    hash.update(password); // 对信息进行哈希处理
    return hash.digest("hex"); // 输出最终的哈希结果（十六进制字符串）
  }
}

class Decrypt {
  // 对称解密算法的实现
  static symmetry(key, iv, encrypted) {
    const algorithm = "aes-256-cbc"; // 算法名称

    const decipher = crypto.createDecipheriv(algorithm, key, iv); // 创建解密器
    decipher.update(encrypted, "hex", "utf8"); // 对信息进行解密并转换为UTF-8字符串
    return decipher.final("utf8"); // 输出最终的解密结果（UTF-8字符串）
  }

  // 非对称解密算法的实现
  static dissymmetry(privateKey, encrypted) {
    const decrypted = crypto.privateDecrypt(privateKey, encrypted); // 使用私钥解密信息
    return decrypted.toString(); // 输出最终的解密结果（UTF-8字符串）
  }
}

export { Encipher, Decrypt };
